package com.liuyfly.leetcode.questions;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

import lombok.extern.slf4j.Slf4j;

/**
 * @author liuyangfang at 2022-10-19 16:42
 */
@Slf4j
public class Question1700 {

    /**
     * 学校的自助午餐提供圆形和方形的三明治，分别用数字 0 和 1 表示。所有学生站在一个队列里，每个学生要么喜欢圆形的要么喜欢方形的。<br/>
     * 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里，每一轮：
     * <ul>
     * <li>如果队列最前面的学生 喜欢 栈顶的三明治，那么会 拿走它 并离开队列。</li>
     * <li>否则，这名学生会 放弃这个三明治 并回到队列的尾部。</li>
     * </ul>
     * 这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。 <br/>
     * 给你两个整数数组 students 和 sandwiches ，其中 sandwiches[i] 是栈里面第 i 个三明治的类型（i = 0
     * 是栈的顶部）， students[j] 是初始队列里第 j 名学生对三明治的喜好（j = 0 是队列的最开始位置）。请你返回无法吃午餐的学生数量。
     * <br/>
     * <br/>
     * 链接：https://leetcode.cn/problems/number-of-students-unable-to-eat-lunch/
     */
    public static int countStudents(int[] students, int[] sandwiches) {
        int s1 = Arrays.stream(students).sum();
        int s0 = students.length - s1;
        for (int sandwich : sandwiches) {
            if (sandwich == 0 && s0 > 0) {
                s0--;
            } else if (sandwich == 1 && s1 > 0) {
                s1--;
            } else {
                break;
            }
        }
        return s0 + s1;
    }

    public static int countStudents_mine(int[] students, int[] sandwiches) {
        Queue<Integer> zeroQueue = new LinkedList<>();
        Queue<Integer> oneQueue = new LinkedList<>();
        for (int i : students) {
            if (i == 0) {
                zeroQueue.add(i);
            } else {
                oneQueue.add(i);
            }
        }
        for (int i = 0; i < students.length; i++) {
            if (zeroQueue.isEmpty() && oneQueue.isEmpty()) {
                return 0;
            }
            if (zeroQueue.isEmpty()) {
                if (sandwiches[i] == 1) {
                    oneQueue.poll();
                } else {
                    return oneQueue.size();
                }
            } else if (oneQueue.isEmpty()) {
                if (sandwiches[i] == 0) {
                    zeroQueue.poll();
                } else {
                    return zeroQueue.size();
                }
            } else {
                if (sandwiches[i] == 0) {
                    zeroQueue.poll();
                } else {
                    oneQueue.poll();
                }
            }
        }
        return 0;
    }

    public static void main(String[] args) {
        //        int[] students = { 1, 1, 0, 0 }, sandwiches = { 0, 1, 0, 1 };
        int[] students = { 1, 1, 1, 0, 0, 1 }, sandwiches = { 1, 0, 0, 0, 1, 1 };
        int result = countStudents(students, sandwiches);
        log.info("result:{}", result);
    }
}
